/*
 * Copyright (c) 2025, 大连理工大学 (Dalian University of Technology)
 *
 * Licensed under the Mulan PSL v2.
 * You can use this file according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of the License at
 *
 *     http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. SEE THE MULAN PSL v2
 * FOR MORE DETAILS.
 */

#pragma once

#include <map>

#include "DataStructure/Common/DataTableType.h"
#include "DataStructure/Common/Id.h"
#include "DataStructure/Common/Status.h"

#include "DBManager/Common/DBManagerExport.h"
#include "DBManager/Common/DBManagerNamespace.h"
#include "DBManager/DBServiceFactory.h"

SG_DBMANAGER_NAMESPACE_OPEN

class DBManager_DECLSPEC DBAPI
{
  public:
    /**
     * @brief 获取数据库中所有节点ID
     *  将数据库中Node表中的所有节点ID 与类似CWeld中定义的虚节点ID（ID>1e+6）取交集
     * @param dbServiceFactory 数据库服务工厂
     * @return
     * @author   wxc
     * @date     2024.12.25
     */
    static std::vector<SG::DataStructure::Common::Id> GetAllNodeId (DBServiceFactory* const dbm);

    /**
     * @brief    将src数据库某条单元数据转存到dest数据库 \n
     *  ※ 该函数对某些词条不支持, 请参考一下`Note`
     * @param    src 源数据库
     * @param    dest 目标数据库
     * @param    dt 数据表类型
     * @param    id 数据ID
     * @author   wuxingchuang
     * @date     2025.02.19
     *
     * @note 通过每个类型注册到数据库的函数，将数据从源数据库拷贝到目标数据库
     *  对于`Dynamic`不支持FRFXIT、FRFCOMP词条
     *  对于`Load`不支持CONV、GRAV
     *  对于`Consraint`不支持SUPORT
     */
    // static SG::DataStructure::Common::Status CopyData (DBServiceFactory* const                    src,
    //                                                    DBServiceFactory* const                    dest,
    //                                                    SG::DataStructure::Common::DataTableType   dt,
    //                                                    std::vector<SG::DataStructure::Common::Id> id);

    /**
     * @brief    将源数据库的所有Subcase转存到目标数据库
     * @param    src 源数据库
     * @param    dest 目标数据库
     * @return
     * @author   wuxingchuang
     * @date     2025.05.27
     */
    // static SG::DataStructure::Common::Status CopySubcaseData (DBServiceFactory* const src, DBServiceFactory* const dest);

    /**
     * @brief    保存分区结果，存储分区号与单元ID的映射关系
     * @param    dbServiceFactory 数据库服务工厂
     * @param    partitionResults 分区结果映射，key为分区号，value为该分区中的单元ID列表
     * @return   操作状态
     * @author   wuxingchuang
     * @date     2025.07.24
     */
    static SG::DataStructure::Common::Status
    SavePartitionResults (DBServiceFactory* const                                                                    dbServiceFactory,
                          const std::map<SG::DataStructure::Common::Id, std::vector<SG::DataStructure::Common::Id>>& partitionResults);

    /**
     * @brief    获取指定分区的所有单元ID
     * @param    dbServiceFactory 数据库服务工厂
     * @param    partitionId 分区ID
     * @return   该分区中的单元ID列表
     * @author   wuxingchuang
     * @date     2025.07.24
     */
    static std::vector<SG::DataStructure::Common::Id> GetPartitionElements (DBServiceFactory* const       dbServiceFactory,
                                                                            SG::DataStructure::Common::Id partitionId);

    /**
     * @brief    获取所有分区的信息
     * @param    dbServiceFactory 数据库服务工厂
     * @return   所有分区的映射关系，key为分区号，value为该分区中的单元ID列表
     * @author   wuxingchuang
     * @date     2025.07.24
     */
    // static std::map<SG::DataStructure::Common::Id, std::vector<SG::DataStructure::Common::Id>>
    // GetAllPartitionResults (DBServiceFactory* const dbServiceFactory);

    /**
     * @brief    初始化分区数据
     *
     * @author   wuxingchuang
     * @date     2025.08.13
     */
    static void initPartitionData (SG::DBManager::DBServiceFactorySP& dbManager, int world_rank);
};

SG_DBMANAGER_NAMESPACE_CLOSE